home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Graphics Plus
/
Graphics Plus.iso
/
msdos
/
fractal
/
frasr182
/
lsysa.asm
< prev
next >
Wrap
Assembly Source File
|
1992-01-29
|
4KB
|
218 lines
; LSYSA.ASM: assembler support routines for optimized L-System code
; Nicholas Wilt, 11/13/91.
;
.MODEL MEDIUM,C
EXTRN reverse:BYTE,angle:BYTE,maxangle:BYTE,dmaxangle:BYTE
EXTRN xpos:DWORD,ypos:DWORD,ssize:DWORD
EXTRN realangle:DWORD
EXTRN lsys_Xmin:DWORD,lsys_Xmax:DWORD,lsys_Ymin:DWORD,lsys_Ymax:DWORD
EXTRN sins:DWORD
EXTRN coss:DWORD
EXTRN overflow:WORD
.CODE
decangle PROC NEAR
mov al,angle
or al,al
jz DecAngle0
dec angle
ret
DecAngle0:
mov al,dmaxangle
mov angle,al
ret
decangle ENDP
incangle PROC NEAR
mov al,angle
inc al
cmp al,maxangle
jnz IncWriteAngle
xor ax,ax
IncWriteAngle:
mov angle,al
ret
incangle ENDP
PUBLIC lsys_doplus
lsys_doplus PROC
cmp reverse,0
jnz PlusIncAngle
call decangle
ret
PlusIncAngle:
call incangle
ret
lsys_doplus ENDP
PUBLIC lsys_dominus
lsys_dominus PROC
cmp reverse,0
jnz MinusDecAngle
call incangle
ret
MinusDecAngle:
call decangle
ret
lsys_dominus ENDP
PUBLIC lsys_doplus_pow2
lsys_doplus_pow2 PROC
mov al,angle
cmp reverse,0
jnz Plus2IncAngle
dec al
and al,dmaxangle
mov angle,al
ret
Plus2IncAngle:
inc al
and al,dmaxangle
mov angle,al
ret
lsys_doplus_pow2 ENDP
PUBLIC lsys_dominus_pow2
lsys_dominus_pow2 PROC
mov al,angle
cmp reverse,0
jz Minus2IncAngle
dec al
and al,dmaxangle
mov angle,al
ret
Minus2IncAngle:
inc al
and al,dmaxangle
mov angle,al
ret
lsys_dominus_pow2 ENDP
PUBLIC lsys_dopipe_pow2
lsys_dopipe_pow2 PROC
xor ax,ax
mov al,maxangle
shr ax,1
xor dx,dx
mov dl,angle
add ax,dx
and al,dmaxangle
mov angle,al
ret
lsys_dopipe_pow2 ENDP
PUBLIC lsys_dobang
lsys_dobang PROC
mov al,reverse ; reverse = ! reverse;
dec al ; -1 if was 0; 0 if was 1
neg al ; 1 if was 0; 0 if was 1
mov reverse,al ;
ret
lsys_dobang ENDP
; Some 386-specific leaf functions go here.
.386
PUBLIC lsys_doslash_386
lsys_doslash_386 PROC N:DWORD
mov eax,N
cmp reverse,0
jnz DoSlashDec
add realangle,eax
ret
DoSlashDec:
sub realangle,eax
ret
lsys_doslash_386 ENDP
PUBLIC lsys_dobslash_386
lsys_dobslash_386 PROC N:DWORD
mov eax,N
cmp reverse,0
jz DoBSlashDec
add realangle,eax
ret
DoBSlashDec:
sub realangle,eax
ret
lsys_dobslash_386 ENDP
PUBLIC lsys_doat_386
lsys_doat_386 PROC N:DWORD
mov eax,ssize ; Get size
imul N ; Mul by n
shrd eax,edx,19 ; Shift right 19 bits
mov ssize,eax ; Save back
ret
lsys_doat_386 ENDP
PUBLIC lsys_dosizegf_386
lsys_dosizegf_386 PROC
mov ecx,ssize ; Get size; we'll need it twice
xor bx,bx ; BX <- angle*sizeof(int)
mov bl,angle ;
shl bx,1 ;
shl bx,1 ;
mov eax,coss[bx] ; eax <- coss[angle]
imul ecx ; Mul by size
shrd eax,edx,29 ; eax <- multiply(size, coss[angle], 29)
add eax,xpos ;
jno nooverfl ; check for overflow
mov overflow,1 ; oops - flag the user later
nooverfl:
cmp eax,lsys_Xmax ; If xpos <= lsys_Xmax,
jle GF1 ; jump
mov lsys_Xmax,eax ;
GF1: cmp eax,lsys_Xmin ; If xpos >= lsys_Xmin
jge GF2 ; jump
mov lsys_Xmin,eax ;
GF2: mov xpos,eax ; Save xpos
mov eax,sins[bx] ; eax <- sins[angle]
imul ecx ;
shrd eax,edx,29 ;
add eax,ypos ;
cmp eax,lsys_Ymax ; If ypos <= lsys_Ymax,
jle GF3 ; jump
mov lsys_Ymax,eax ;
GF3: cmp eax,lsys_Ymin ; If ypos >= lsys_Ymin
jge GF4 ; jump
mov lsys_Ymin,eax ;
GF4: mov ypos,eax ;
ret
lsys_dosizegf_386 ENDP
PUBLIC lsys_dodrawg_386
lsys_dodrawg_386 PROC
mov ecx,ssize ; Because we need it twice
xor bx,bx ; BX <- angle * sizeof(int)
mov bl,angle ;
shl bx,1 ;
shl bx,1 ;
mov eax,coss[bx] ; eax <- coss[angle]
imul ecx ;
shrd eax,edx,29 ;
add xpos,eax ; xpos += size*coss[angle] >> 29
mov eax,sins[bx] ; eax <- sins[angle]
imul ecx ; ypos += size*sins[angle] >> 29
shrd eax,edx,29 ;
add ypos,eax ;
ret ;
lsys_dodrawg_386 ENDP
END